/**
 * 
 */
package com.pe.pgn.clubpgn.webapp.controller;

import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbPrograma;
import com.pe.pgn.clubpgn.domain.ClprPeriodoPrograma;
import com.pe.pgn.clubpgn.domain.beans.BNLiquidacion;
import com.pe.pgn.clubpgn.domain.beans.BNPeriodo;
import com.pe.pgn.clubpgn.domain.beans.BNReporteLiquidacion;
import com.pe.pgn.clubpgn.domain.beans.BNResumenLiquidacion;
import com.pe.pgn.clubpgn.service.ProgramaService;
import com.pe.pgn.clubpgn.service.ReporteLiquidacionService;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

/**
 * @author Edwin Farfan
 *
 */

@Controller
@RequestMapping("/reporteLiquidacion/**")
public class ReporteLiquidacionController extends BaseFormController{
	
	@Autowired
	private ReporteLiquidacionService service;
	
	@Autowired
	private ProgramaService programaService;
	
	@RequestMapping(value = "/reporteLiquidacion.html", method = RequestMethod.GET)
    public @ModelAttribute("reporteLiqui") BNLiquidacion get() {
		
		BNLiquidacion bnLiquidacion = new BNLiquidacion();
		
		List<ClpbPrograma> programas = programaService.findListaProgramas();		
		bnLiquidacion.setProgramas(programas);
		
		ClpbPrograma programa = programas.get(0);
		List<BNPeriodo> periodos = service.periodosPorPrograma(programa.getId(), null, false);
		bnLiquidacion.setPeriodos(periodos);
				
        return bnLiquidacion;
    }
	
    @RequestMapping(value = "/reporteLiquidacion.html", method = RequestMethod.POST)
    public @ModelAttribute("reporteLiqui") BNLiquidacion listadoReporteLiquidacion
    		(@ModelAttribute("reporteLiqui") BNLiquidacion reporteLiqui, ModelMap modelMap){
    	    	
    	String idPrograma = reporteLiqui.getIdPrograma().toString();
    	String idPeriodo = reporteLiqui.getIdPeriodo().toString();
    	
    	if (StringUtils.isNotBlank(idPeriodo) && StringUtils.isNotBlank(idPrograma)){
    		
	    	List<BNReporteLiquidacion> listado = service.listReporteLiquidacionConFiltros(idPeriodo, idPrograma);
	    	
	    	List<ClpbPrograma> programas = programaService.findListaProgramas();		
	    	reporteLiqui.setProgramas(programas);
			
			List<BNPeriodo> periodos = service.periodosPorPrograma(Long.parseLong(idPrograma), null, true);
			reporteLiqui.setPeriodos(periodos);
	    	
			modelMap.addAttribute("liquidaciones", listado);
    	}
    	return reporteLiqui;
    }
    
    @RequestMapping(value = "find/ByProgramaPeriodoAndMetas", method = RequestMethod.GET)
    public @ModelAttribute("reporteLiqui") BNLiquidacion  findReporteByFiltrosProgramaMetasPeriodo(ModelMap modelMap,HttpServletRequest request) {
    	
    	String idPeriodo=request.getParameter("periodos");
    	String idPrograma=request.getParameter("programas");
    	BNLiquidacion bnLiquidacion= new BNLiquidacion(); 
    	if((StringUtils.isNotBlank(idPeriodo))&&(StringUtils.isNotBlank(idPrograma))){
    		
    		bnLiquidacion.setPeriodos(service.periodosPorPrograma(new Long(idPrograma),null, true));
    		bnLiquidacion.setProgramas(programaService.findListaProgramas());
    	}
    	return bnLiquidacion;
    }
    
    @RequestMapping(value = "/generaLiquidacion.html")
    public String generaLiquidacion(ModelMap modelMap, HttpServletRequest request){
		
    	String idPeriodo = request.getParameter("periodo");
    	String idPrograma = request.getParameter("programa");
    	
    	Map<String, Object> resultados = service.generarLiquidacionSP(new Long (idPrograma), new Long (idPeriodo));
    	BigDecimal coPeriodoLiquidacion = (BigDecimal) resultados.get("P_COPERIODOLIQUIDACION");
    	if(coPeriodoLiquidacion != null){
    		
    		BNResumenLiquidacion resumen = service.generarResumenLiquidacion(coPeriodoLiquidacion);

        	modelMap.addAttribute("resumenLiquidacion", resumen);
    		return "/reporteLiquidacion/resumenLiquidacion";
    	}
    	
    	return "redirect:reporteLiquidacion.html";
    	
    }
    
    @RequestMapping(value = "/consultarLiquidacion.html")
    public String consultarLiquidacion(@RequestParam("idPrograma") String idPrograma, 
    		@RequestParam("idPeriodo") String idPeriodo, ModelMap modelMap,HttpServletRequest request){


    		ClpbPrograma programa = service.findClpbPrograma(new Long(idPrograma));
    		ClprPeriodoPrograma periodo= service.findClprPeriodoPrograma(new Long(idPeriodo));
    		
    		BNPeriodo periodobean= service.periodosPorPrograma(programa.getId(),periodo.getId(), false).get(0);
    		modelMap.addAttribute("dePrograma", programa.getDePrograma());
    		modelMap.addAttribute("periodo", periodobean);
    		
    		List<BNReporteLiquidacion> consultaReporte= service.consultarLiquidaciones(programa, periodo);
    		
    		modelMap.addAttribute("consultaReporte", consultaReporte);
    		return "/reporteLiquidacion/consultareporteliquidacion";
    		
    /*		
    	if (StringUtils.isNotBlank(idPeriodo) && StringUtils.isNotBlank(idPrograma)){ 		
    		}
    		else{
    		modelMap.addAttribute("programas", service.listadoProgramasHistoricos());
    		return "/reporteLiquidacion/consultareporteliquidacion";
    	}
    */	
    }
    
    
    @RequestMapping(value = "/exportReporteLiquidacion.html", method = RequestMethod.GET)
	public String exportCSVFile(Model model){
    	
    	model.addAttribute("programas", service.listadoProgramasHistoricos());
       	return "/reporteLiquidacion/exportreporteliquidacion";
    }
    
	@RequestMapping(value = "/exportReporteLiquidacionFile.html")
	public void exportCSVFile(
			@RequestParam(value = "programa", required = false) String coPrograma,
			@RequestParam(value = "periodo", required = false) String coPeriodo,
			@RequestParam(value = "deSeparador", required = false) String deSeparador,
			HttpServletRequest request, HttpServletResponse res,ModelMap modelMap)
			throws Exception {
		
		if (StringUtils.isNotBlank(coPeriodo) && StringUtils.isNotBlank(coPrograma) 
				&& StringUtils.isNotBlank(coPrograma)){
			
			try {
				
    		ClprPeriodoPrograma periodo= service.findClprPeriodoPrograma(new Long(coPeriodo));
    		
				List<Map<String, Object>> registrosLiquidacion = service.obtenerRegistrosLiquidacionPorPeriodo(new BigDecimal(coPrograma), new BigDecimal (coPeriodo));
    		
				//Primer d�a del proximo mes
				Calendar primerDia = Calendar.getInstance();
				primerDia.setTimeInMillis(periodo.getDaFechaFinLiq().getTimeInMillis());
				primerDia.set(Calendar.MONTH, primerDia.get(Calendar.MONTH)+ 1);
				primerDia.set(Calendar.DATE, 1);
				String primerDiaLiquidacion = CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN_LIQ, primerDia);
				System.out.println("proximo mes "+CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN_LIQ, primerDia));
			
				//Ultimo dia del proximo mes
				Calendar ultimoDia = Calendar.getInstance();
				ultimoDia.setTimeInMillis(primerDia.getTimeInMillis());
				ultimoDia.set(Calendar.MONTH, primerDia.get(Calendar.MONTH) +1);
				ultimoDia.set(Calendar.DATE, 1);		
				ultimoDia.set(Calendar.DATE, ultimoDia.get(Calendar.DATE) - 1);
				String ultimoDiaLiquidacion = CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN_LIQ, ultimoDia);
				System.out.println("ultimodia  "+CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN_LIQ, ultimoDia));
			
			StringBuilder exporRow= new StringBuilder();
				for (Iterator<Map<String, Object>> it = registrosLiquidacion.iterator(); it.hasNext();) {
				
					Map<String, Object> record = it.next();
				
				String id= String.valueOf(record.get("id"));
					String poliza= ""; String.valueOf(record.get("poliza"));
				String tipoDocumento= String.valueOf(record.get("tipoDocumento"));
				String numeroDocumento= String.valueOf(record.get("numeroDocumento"));
				String apellidoPaterno= String.valueOf(record.get("apellidoPaterno"));
				String apellidoMaterno= String.valueOf(record.get("apellidoMaterno"));
				String nombre= String.valueOf(record.get("nombre"));
				String fechaNacimiento= String.valueOf(record.get("fechaNacimiento"));
				String sexo= String.valueOf(record.get("sexo"));
					String inicioVigencia= primerDiaLiquidacion;
					String finVigencia= ultimoDiaLiquidacion;
				String prima= String.valueOf(record.get("prima"));
				String estacion= String.valueOf(record.get("estacion"));
				
					exporRow.append(id == null ? "": id).append(deSeparador);
					exporRow.append(poliza == null ? "": poliza).append(deSeparador);
					exporRow.append(tipoDocumento == null ? "": tipoDocumento).append(deSeparador);
					exporRow.append( numeroDocumento == null ? "": numeroDocumento).append(deSeparador);
					exporRow.append( apellidoPaterno == null ? "": apellidoPaterno).append(deSeparador);
					exporRow.append( apellidoMaterno == null ? "": apellidoMaterno).append(deSeparador);
					exporRow.append( nombre == null ? "": nombre).append(deSeparador);
					exporRow.append( fechaNacimiento == null ? "": fechaNacimiento).append(deSeparador);
					exporRow.append( sexo == null ? "": sexo).append(deSeparador);
					exporRow.append( inicioVigencia == null ? "": inicioVigencia).append(deSeparador);
					exporRow.append( finVigencia == null ? "": finVigencia).append(deSeparador);
					exporRow.append( prima == null ? "": prima).append(deSeparador);
					exporRow.append( estacion == null ? "": estacion).append(deSeparador);
					exporRow.append("\r\n");
			}

			if (registrosLiquidacion.size()>0){
				
				PrintWriter out = res.getWriter();
				res.setContentType("application/rtf");
				res.setHeader("Content-Disposition","attachment; filename=\"exportLiquidacion.txt\" ");
				res.addHeader("Content-Disposition", "attachment; filename=\"exportLiquidacion.txt\" ");
				out.write(exporRow.toString()); 
				out.close();
				}
			
			}catch (NullPointerException e) {
				saveError(request, getText("exporta.liquidacion.no.valores", request.getLocale()));
				modelMap.addAttribute("programas", service.listadoProgramasHistoricos());
				log.info(e.getMessage());
			}catch (Exception e) {
				saveError(request, getText("errors.general", request.getLocale()));
				modelMap.addAttribute("programas", service.listadoProgramasHistoricos());
				log.info(e.getMessage());
			}
		}
		

	}
}
